import pandas as pd

# data	输入的数据，可以是 ndarray，series，list，dict，标量以及一个 DataFrame。
# index	行标签，如果没有传递 index 值，则默认行标签是 np.arange(n)，n 代表 data 的元素个数。
# columns	列标签，如果没有传递 columns 值，则默认列标签是 np.arange(n)。
# dtype	dtype表示每一列的数据类型。
# copy	默认为 False，表示复制数据 data。

# 列表创建DataFame对象 5行1列 未指定columns默认是0
df0 = pd.DataFrame([1, 2, 3, 4, 5])
df1 = pd.DataFrame([['Alex', 10], ['Bob', 12], ['Clarke', 13]], columns=['Name', 'Age'])
#      Name  Age
# 0    Alex   10
# 1     Bob   12
# 2  Clarke   13

# 字典嵌套列表创建  key就是column，列表代表一列数据
df2 = pd.DataFrame({'Name': ['Tom', 'Jack', 'Steve', 'Ricky'], 'Age': [28, 34, 29, 42]})
#     Name  Age
# 0    Tom   28
# 1   Jack   34
# 2  Steve   29
# 3  Ricky   42

# 列表嵌套字典创建DataFrame对象
df3 = pd.DataFrame([{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}], index=['first', 'second'])
#         a   b     c
# first   1   2   NaN
# second  5  10  20.0

# Series创建DataFrame对象
d = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
     'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df4 = pd.DataFrame(d)
#    one  two
# a  1.0    1
# b  2.0    2
# c  3.0    3
# d  NaN    4

print(df4['one'])
# a    1.0
# b    2.0
# c    3.0
# d    NaN

# 列索引添加数据列
df4['three'] = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
df4['four'] = df4['one'] + df4['three']
#    one  two  three  four
# a  1.0    1   10.0  11.0
# b  2.0    2   20.0  22.0
# c  3.0    3   30.0  33.0
# d  NaN    4    NaN   NaN

# 数值1代表插入到columns列表的索引位置
info = [['Jack', 18], ['Helen', 19], ['John', 17]]
df5 = pd.DataFrame(info, columns=['name', 'age'])
df5.insert(1, column='score', value=[91, 90, 75])
print(df5)

# 列索引删除数据列  del 和 pop()
# del df4['one']
# df4.pop('two')

# 行索引操作DataFrame

#  标签索引选取 loc
print(df4.loc['b'])
# one       2.0
# two       2.0
# three    20.0
# four     22.0
# Name: b, dtype: float64
#  整数索引选取
print(df4.iloc[2])
# one       3.0
# two       3.0
# three    30.0
# four     33.0
# Name: c, dtype: float64

# 切片操作多行选取 左闭右开
print(df4[2:4])
#    one  two  three  four
# c  3.0    3   30.0  33.0
# d  NaN    4    NaN   NaN

# 删除数据行 drop
# df4 = df4.drop(0)
# print(df4)
#    one  two  three  four
# c  3.0    3   30.0  33.0
# d  NaN    4    NaN   NaN

# DataFrame 的属性和方法 与 Series 相差无几
# T	行和列转置。
# axes	返回一个仅以行轴标签和列轴标签为成员的列表。
# dtypes	返回每列数据的数据类型。
# empty	DataFrame中没有数据或者任意坐标轴的长度为0，则返回True。
# ndim	轴的数量，也指数组的维数。
# shape	返回一个元组，表示了 DataFrame 维度。
# size	DataFrame中的元素数量。
# values	使用 numpy 数组表示 DataFrame 中的元素值。
# head()	返回前 n 行数据。
# tail()	返回后 n 行数据。
# shift()	将行或列移动指定的步幅长度

d9 = {'Name': pd.Series(['c语言中文网', '编程帮', "百度", '360搜索', '谷歌', '微学苑', 'Bing搜索']),
      'years': pd.Series([5, 6, 15, 28, 3, 19, 23]),
      'Rating': pd.Series([4.23, 3.24, 3.98, 2.56, 3.20, 4.6, 3.8])}
# 构建DataFrame
df9 = pd.DataFrame(d9)
# 输出series
print(df9)
#      Name  years  Rating
# 0  c语言中文网      5    4.23
# 1     编程帮      6    3.24
# 2      百度     15    3.98
# 3   360搜索     28    2.56
# 4      谷歌      3    3.20
# 5     微学苑     19    4.60
# 6  Bing搜索     23    3.80
print(df9.T)  # 输出DataFrame的转置
print(df9.axes)  # 输出行、列标签
# [RangeIndex(start=0, stop=7, step=1), Index(['Name', 'years', 'Rating'], dtype='object')]
print(df9.dtypes)  # 输出行、列标签
# Name       object
# years       int64
# Rating     float64
# dtype:     object
print(df9.empty)  # 判断输入数据是否为空
print(df9.ndim)  # DataFrame的维度
print(df9.shape)  # DataFrame的形状
print(df9.size)  # DataFrame的中元素个数
print(df9.values)  # DataFrame的数据
print(df9.head(3))  # 获取前3行数据
print(df9.tail(2))  # 获取后2行数据

# shift()移动行或列
# peroids	类型为int，表示移动的幅度，可以是正数，也可以是负数，默认值为1。
# freq	日期偏移量，默认值为None，适用于时间序。取值为符合时间规则的字符串。
# axis	如果是 0 或者 "index" 表示上下移动，如果是 1 或者 "columns" 则会左右移动。
# fill_value	该参数用来填充缺失值。
info = pd.DataFrame({'a_data': [40, 28, 39, 32, 18],
                     'b_data': [20, 37, 41, 35, 45],
                     'c_data': [22, 17, 11, 25, 15]})
# 移动幅度为3
info.shift(periods=3)
#    a_data  b_data  c_data
# 0     NaN     NaN     NaN
# 1     NaN     NaN     NaN
# 2     NaN     NaN     NaN
# 3    40.0    20.0    22.0
# 4    28.0    37.0    17.0
# 将缺失值和原数值替换为52
info.shift(periods=3, axis=1, fill_value=52)
#    a_data  b_data  c_data
# 0      52      52      52
# 1      52      52      52
# 2      52      52      52
# 3      52      52      52
# 4      52      52      52
